home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / lib / avahi / avahi-daemon-check-dns.sh next >
Linux/UNIX/POSIX Shell Script  |  2009-10-18  |  4KB  |  140 lines

  1. #!/bin/sh
  2. #
  3. # If we have an unicast .local domain, we immediately disable avahi to avoid
  4. # conflicts with the multicast IP4LL .local domain
  5.  
  6. PATH=/bin:/usr/bin:/sbin:/usr/sbin
  7.  
  8. RUNDIR="/var/run/avahi-daemon/"
  9. DISABLE_TAG="$RUNDIR/disabled-for-unicast-local"
  10. NS_CACHE="$RUNDIR/checked_nameservers"
  11.  
  12. AVAHI_DAEMON_DETECT_LOCAL=1
  13.  
  14. test -f /etc/default/avahi-daemon && . /etc/default/avahi-daemon
  15.  
  16. if [ "$AVAHI_DAEMON_DETECT_LOCAL" != "1" ]; then
  17.   exit 0
  18. fi
  19.  
  20. ensure_rundir() {
  21.   if [ ! -d ${RUNDIR} ] ; then 
  22.     mkdir -m 0755 -p ${RUNDIR}
  23.     chown avahi:avahi ${RUNDIR}
  24.   fi 
  25. }
  26.  
  27. dns_reachable() {
  28.   # If there are no nameserver entries in resolv.conf there is no dns reachable
  29.   $(grep -q nameserver /etc/resolv.conf) || return 1;
  30.  
  31.   # If there is no local nameserver and no we have no global ip addresses
  32.   # then we can't reach any nameservers
  33.   if ! $(egrep -q "nameserver 127.0.0.1|::1" /etc/resolv.conf); then 
  34.     # Get addresses of all running interfaces
  35.     ADDRS=$(LC_ALL=C ifconfig | grep ' addr:')
  36.     # Filter out all local addresses
  37.     ADDRS=$(echo "${ADDRS}" | egrep -v ':127|Scope:Host|Scope:Link')
  38.     if [ -z "${ADDRS}" ] ; then
  39.       return 1;
  40.     fi
  41.   fi
  42.  
  43.   return 0
  44. }
  45.  
  46. dns_has_local() { 
  47.   # Some magic to do tests 
  48.   if [ -n "${FAKE_HOST_RETURN}" ] ; then
  49.     if [ "${FAKE_HOST_RETURN}" = "true" ]; then
  50.       return 0;
  51.     else
  52.       return 1;
  53.     fi
  54.   fi
  55.  
  56.   OUT=`LC_ALL=C host -t soa local. 2>&1`
  57.   if [ $? -eq 0 ] ; then
  58.     if echo "$OUT" | egrep -vq 'has no|not found'; then
  59.       return 0
  60.     fi
  61.   else 
  62.     # Checking the dns servers failed. Assuming no .local unicast dns, but
  63.     # remove the nameserver cache so we recheck the next time we're triggered
  64.     rm -f ${NS_CACHE}
  65.   fi
  66.   return 1
  67. }
  68.  
  69. dns_needs_check() {
  70.   TMP_CACHE="${NS_CACHE}.$$"
  71.   RET=0
  72.  
  73.   ensure_rundir
  74.   cat /etc/resolv.conf | grep "nameserver" | sort > ${TMP_CACHE} || return 0
  75.  
  76.   if [ -e ${NS_CACHE} ]; then 
  77.     DIFFERENCE=$(diff -w ${NS_CACHE} ${TMP_CACHE})
  78.     echo "${DIFFERENCE}" | grep -q '^>'
  79.     ADDED=$?
  80.     echo "${DIFFERENCE}" | grep -q '^<'
  81.     REMOVED=$?
  82.     # Avahi was disabled and no servers were removed, no need to recheck
  83.     [ -e ${DISABLE_TAG} ] && [ ${REMOVED} -ne 0 ]  && RET=1
  84.     # Avahi was enabled and no servers were added, no need to recheck
  85.     [ ! -e ${DISABLE_TAG} ] && [ ${ADDED} -ne 0 ]  && RET=1
  86.   fi
  87.  
  88.   mv ${TMP_CACHE} ${NS_CACHE}
  89.   return ${RET};
  90. }
  91.  
  92.  
  93. enable_avahi () {
  94.   # no unicast .local conflict, so remove the tag and start avahi again
  95.   if [ -e ${DISABLE_TAG} ]; then
  96.     rm -f ${DISABLE_TAG}
  97.     start avahi-daemon || :
  98.   fi
  99. }
  100.  
  101. disable_avahi () {
  102.   [ -e ${DISABLE_TAG} ] && return
  103.  
  104.   stop avahi-daemon || :
  105.   if [ -x /usr/bin/logger ]; then
  106.     logger -p daemon.warning -t avahi <<EOF
  107. Avahi detected that your currently configured local DNS server serves
  108. a domain .local. This is inherently incompatible with Avahi and thus
  109. Avahi disabled itself. If you want to use Avahi in this network, please
  110. contact your administrator and convince him to use a different DNS domain,
  111. since .local should be used exclusively for Zeroconf technology.
  112. For more information, see http://avahi.org/wiki/AvahiAndUnicastDotLocal
  113. EOF
  114.   fi
  115.   ensure_rundir
  116.   touch ${DISABLE_TAG}
  117. }
  118.  
  119. if ! dns_reachable ; then
  120.   # No unicast dns server reachable, so enable avahi
  121.   enable_avahi
  122.   # And blow away the dns cache, so we force a recheck when the interface comes
  123.   # up again
  124.   rm -f ${NS_CACHE}
  125.   exit 0
  126. fi
  127.  
  128. # Check if the dns needs checking..
  129. dns_needs_check || exit 0
  130.  
  131. if dns_has_local ; then
  132.   # .local from dns server, disabling avahi
  133.   disable_avahi
  134. else
  135.   # no .local from dns server, enabling avahi
  136.   enable_avahi
  137. fi
  138.  
  139. exit 0
  140.